﻿using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace SocialApi.Instagram.Entities.Methods.Media
{
    /// <summary>
    /// Методы работы с медиа API
    /// </summary>
    public interface IMediaMethods
    {
        /// <summary>
        /// Получение детальной информации о медиа
        /// </summary>
        /// <param name="mediaId">Id текущей медиа, информацию которой хотим получить</param>
        IResult Media(long mediaId);

        /// <summary>
        /// Асинхронное получение детальной информации о медиа
        /// </summary>
        /// <param name="mediaId">Id текущей медиа, информацию которой хотим получить</param>
        Task<IResult> MediaAsync(long mediaId);

        /// <summary>
        /// Получение списка популярных медиа
        /// </summary>
        IEnumerable<IResult> Popular();

        /// <summary>
        /// Асинхронное получение списка популярных медиа
        /// </summary>
        Task<IEnumerable<IResult>> PopularAsync();

        /// <summary>
        /// Поиск медиа
        /// </summary>
        /// <param name="distance">Дистанция в метрах (по умолчанию 1000)</param>
        IEnumerable<IResult> Search(int distance);

        /// <summary>
        /// Поиск медиа
        /// </summary>
        /// <param name="latitude">Широта</param>
        /// <param name="longitude">Долгота</param>
        IEnumerable<IResult> Search(double latitude, double longitude);

        /// <summary>
        /// Поиск медиа
        /// </summary>
        /// <param name="distance">Дистанция в метрах (по умолчанию 1000)</param>
        /// <param name="latitude">Широта</param>
        /// <param name="longitude">Долгота</param>
        IEnumerable<IResult> Search(int distance, double latitude, double longitude);

        /// <summary>
        /// Поиск медиа
        /// </summary>
        /// <param name="min">Минимальная временная метка в UNIX - формате</param>
        /// <param name="max">Максимальная временная метка в UNIX - формате</param>
        IEnumerable<IResult> Search(TimeSpan? min, TimeSpan? max);

        /// <summary>
        /// Поиск медиа
        /// </summary>
        /// <param name="distance">Дистанция в метрах (по умолчанию 1000)</param>
        /// <param name="min">Минимальная временная метка в UNIX - формате</param>
        /// <param name="max">Максимальная временная метка в UNIX - формате</param>
        IEnumerable<IResult> Search(int distance, TimeSpan? min, TimeSpan? max);

        /// <summary>
        /// Поиск медиа
        /// </summary>
        /// <param name="distance">Дистанция в метрах (по умолчанию 1000)</param>
        /// <param name="latitude">Широта</param>
        /// <param name="longitude">Долгота</param>
        /// <param name="min">Минимальная временная метка в UNIX - формате</param>
        /// <param name="max">Максимальная временная метка в UNIX - формате</param>
        IEnumerable<IResult> Search(int distance, double latitude, double longitude, TimeSpan? min, TimeSpan? max);

        /// <summary>
        /// Асинхронное поиск медиа
        /// </summary>
        /// <param name="distance">Дистанция в метрах (по умолчанию 1000)</param>
        Task<IEnumerable<IResult>> SearchAsync(int distance);

        /// <summary>
        /// Асинхронное поиск медиа
        /// </summary>
        /// <param name="latitude">Широта</param>
        /// <param name="longitude">Долгота</param>
        Task<IEnumerable<IResult>> SearchAsync(double latitude, double longitude);

        /// <summary>
        /// Асинхронное поиск медиа
        /// </summary>
        /// <param name="distance">Дистанция в метрах (по умолчанию 1000)</param>
        /// <param name="latitude">Широта</param>
        /// <param name="longitude">Долгота</param>
        Task<IEnumerable<IResult>> SearchAsync(int distance, double latitude, double longitude);

        /// <summary>
        /// Асинхронное поиск медиа
        /// </summary>
        /// <param name="min">Минимальная временная метка в UNIX - формате</param>
        /// <param name="max">Максимальная временная метка в UNIX - формате</param>
        Task<IEnumerable<IResult>> SearchAsync(TimeSpan? min, TimeSpan? max);

        /// <summary>
        /// Асинхронное поиск медиа
        /// </summary>
        /// <param name="distance">Дистанция в метрах (по умолчанию 1000)</param>
        /// <param name="min">Минимальная временная метка в UNIX - формате</param>
        /// <param name="max">Максимальная временная метка в UNIX - формате</param>
        Task<IEnumerable<IResult>> SearchAsync(int distance, TimeSpan? min, TimeSpan? max);

        /// <summary>
        /// Асинхронное поиск медиа
        /// </summary>
        /// <param name="distance">Дистанция в метрах (по умолчанию 1000)</param>
        /// <param name="latitude">Широта</param>
        /// <param name="longitude">Долгота</param>
        /// <param name="min">Минимальная временная метка в UNIX - формате</param>
        /// <param name="max">Максимальная временная метка в UNIX - формате</param>
        Task<IEnumerable<IResult>> SearchAsync(int distance, double latitude, double longitude, TimeSpan? min, TimeSpan? max);
    }
}